<?php
	/* clase para ejecutar procesos MySQL (solo procesos) */
	class MySQLProcess extends MySQLLink {
		/* consulta temporal	*/
		protected $tempSQL		= False;
		/* ultimo SQL ejecutado	*/
		protected $lastSQL		= False;
		/**/
		protected $affected		= False;

		public function ejecutarSQL($sql = False) {
			try {
				/* mostramos un mensaje para identificar que estamos haciendo */
				$this->show('Ejecutando consulta SQL..' . (
					/* verificamos si envio como parametros un SQL */
					$sql ?
					/* le damos formato */
					$this->italic(' (' . $sql . ')') :
					/* si no envio un SQL */
					(
						/* verificamos si existe un SQL almacenado */
						$this->existeSQL() ?
						/* le damos formato */
						$this->italic(' (' . $this->tempSQL . ')') :
						/* sino no mostramos nada */
						''
					)
				/* agregamos los dos puntos */
				) . '..', False);
				/* verificamos si esta conectado */
				$this->verificarConexion();
				/* buscamos por un SQL sin ejecutar */
				$this->buscarSQL($sql);
				/* verificamos si envio alguna consulta */
				if ($sql === False && !$this->existeSQL())
					/* si no existe ningun SQL y no envio ningun SQL mostramos un error */
					$this->newException('No existe una consulta para ejecutar');
				/* verificamos si hay una DB seleccionada */
				if (!$this->isDBSelected())
					/* si no hay ninguna DB seleccionada mostramos un mensaje de error */
					$this->newException('No existe una Base de Datos seleccionada');
				/* si envio un SQL por parametros */
				if ($sql !== False)
					/* reemplazamos la consulta existente */
					$this->tempSQL = $sql;
				/* ejecutamos la consulta */
				$this->runSQL($this->tempSQL);
				/* mostramos el OK al mensaje */
				$this->showOK();
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		public function getResultadoSQL() {
			try {
				/* verificamos si existe una consulta activa */
				if (!$this->existeConsulta()) {
					/* si no existe verificamos si hay un SQL para ejecutar */
					if ($this->existeSQL()) {
						/* si existe un SQL para ejecutar lo ejecutamos */
						$this->ejecutarSQL();
						/* verificamos si se ejecuto la consulta */
						if (!$this->existeConsulta()) {
							$this->show('Enviando resultados de la consulta..', False);
							$this->newException('No hay ninguna consulta activa');
						}
					} else {
						$this->show('Enviando resultados de la consulta..', False);
						$this->newException('No hay ninguna consulta activa');
					}
				}
				/* mostramos un mensaje para identificar lo que estamos haciendo */
				$this->show('Enviando resultados de la consulta..', False);
				/* verificamos si existe una conexion */
				$this->verificarConexion();
				/* enviamos resultados */
				$this->showOK();
				return mysql_fetch_object($this->getConsulta());
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			} catch (ErrorException $e) {
				return False;
			}
		}

		public function getNumRows() {
			try {
				/* verificamos si existe una consulta activa */
				if (!$this->existeConsulta()) {
					/* si no existe verificamos si hay un SQL para ejecutar */
					if ($this->existeSQL()) {
						/* si existe un SQL para ejecutar lo ejecutamos */
						$this->ejecutarSQL();
						/* verificamos si se ejecuto la consulta */
						if (!$this->existeConsulta() && $this->affected === False) {
							$this->show('Enviando cantidad de filas de la consulta..', False);
							$this->newException('No hay ninguna consulta activa');
						}
					} elseif ($this->affected === False) {
						$this->show('Enviando cantidad de filas de la consulta..', False);
						$this->newException('No hay ninguna consulta activa');
					}
				}
				/* mostramos un mensaje para identificar lo que estamos haciendo */
				$this->show('Enviando cantidad de filas de la consulta..', False);
				/* verificamos si existe una conexion */
				$this->verificarConexion();
				/* obtenemos la cantidad de filas resultados */
				if ($this->affected === False)
					/* si la bandera esta en false podemos obtener resultados */
					$filas = mysql_num_rows($this->getConsulta());
				else
					/* sino es porq la consulta fue un INSERT o algo parecido que solo retorna la cantidad */
					$filas = $this->affected;
				/* mostramos OK al mensaje */
				$this->showOK();
				/* enviamos la cantidad */
				return $filas;
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		public function showResultadoSQL() {
			try {
				$cabecera = True;
				if (isset($_SERVER["HTTP_USER_AGENT"]))
					echo '<TABLE>';
				echo 'SELECTED ROWS: ' . $this->getNumRows() . (isset($_SERVER["HTTP_USER_AGENT"]) ? '<BR/>' : "\n");
				while ($sql = $this->getResultadoSQL()) {
					if (isset($_SERVER["HTTP_USER_AGENT"]))
						echo '<TR>';
					$tits = get_object_vars($sql);
					if ($cabecera) {
						$cabecera = False;
						foreach ($tits AS $indice => $valor)
							echo (
								isset($_SERVER["HTTP_USER_AGENT"]) ?
								"<TD align='center'>[$indice]</TD><TD width='5px'></TD>" :
								"$indice\t"
							);
						echo (isset($_SERVER["HTTP_USER_AGENT"]) ? '</TR><TR>' : "\n");
					}
					foreach ($tits AS $indice => $valor)
						echo (isset($_SERVER["HTTP_USER_AGENT"]) ? "<TD>$valor</TD><TD></TD>" : "$valor\t");
					if (isset($_SERVER["HTTP_USER_AGENT"]))
						echo '</TR>';
				}
				if (isset($_SERVER["HTTP_USER_AGENT"]))
					echo '</TABLE>';
			} catch (MyException $e) {
				$this->show($e->getMensaje($this->html));
			}
		}

		protected final function buscarSQL($params = False) {
			/* verificamos si existe un SQL que no fue ejecutado */
			if ($this->existeSQL() && $params !== False)
				$this->show('Hay un SQL que no se ejecuto, se sobreescribe el SQL..', False);
		}

		protected final function getConsulta() {
			/* retornamos la ultima consulta */
			return $this->lastSQL;
		}

		protected final function existeConsulta() {
			/* verificamos si existe una consulta */
			return (
				/* si la consulta es FALSE */
				$this->getConsulta() === False ?
				/* no existe una consulta, retornamos FALSE */
				False :
				/* sino, retornamos TRUE, porque existe una consulta */
				True
			);
		}

		protected final function existeSQL() {
			/* verificamos si hay un SQL */
			return (
				/* si no existe una consulta */
				$this->tempSQL === False ?
				/* retornamos FALSE */
				False :
				/* sino, retornamos TRUE */
				True
			);
		}

		protected final function runSQL($sql) {
			try {
				/* intentamos ejecutar la consulta */
				$this->lastSQL = mysql_query($sql, $this->getLink());
				/* verificamos si se ejecuto */
				if (!$this->lastSQL)
					/* si no se ejecuto mostramos un mensaje */
					$this->newException('No se pudo ejecutar la consulta: ' . mysql_error());
				else {
					/* si se ejecuto vaciamos el cache de error */
					$this->setError(False);
					/* verificamos el tipo de consulta ejecutada */
					if (gettype($this->lastSQL) == 'boolean') {
						/* obtenemos la cantidad de filas afectadas */
						$this->affected	= mysql_affected_rows();
						/* si es booleano es porque se ejecuto una consulta que no retorna resultados. Ej: INSERT */
						$this->lastSQL		= False;
					} else
						/* deshabilitamos la bandera */
						$this->affected	= False;
					/* vaciamos el atributo con el SQL temporal */
					$this->tempSQL = False;
				}
			} catch (ErrorException $error) {
				/* si no se pudo ejecutar devolvemos el error */
				$this->newException('No se pudo ejecutar la consulta: ' . mysql_error());
			}
		}
	}
?>